#ifndef _HELLO_CLASS_H_
#define _HELLO_CLASS_H_

#include <iostream>
#include <string>
#include <boost/shared_ptr.hpp>
#include <vector>

/** Add comment 
* More commenting 
* And more still
*/
class Hello
{
public:
   Hello()
   {
      mMessage = "No message";
      mName = "HelloClass";
      setNums(std::vector<int>(5,1));
      setFloats(std::vector<float>(3,1.2));
   }

   Hello(std::string msg)
   {
      mMessage = msg;
      mName = "HelloClass";
      setNums(std::vector<int>(5,2));
      setFloats(std::vector<float>(3,1.7));      
   }

   std::string getMessage()
   { return mMessage; }
   void setMessage(std::string msg)
   { mMessage = msg; }

   std::string getName()
   { return mName; }
   void setName(std::string name)
   { mName = name; }

   void printWelcome()
   { 
      std::cout << "Hello, I am " << mName << ". Message: " << mMessage << std::endl; 
   }  
   
   std::vector<int> getNums()
   { return nums; }
   void setNums(std::vector<int> n)
   { nums = n; }
   void printNums()
   {
      for (unsigned i=0;i<nums.size();++i)
         std::cout << i << ": " << nums[i] << std::endl;
   }
   
   std::vector<float> getFloats()
   { return floats; }
   void setFloats(std::vector<float> f)
   { floats = f; }
   void printFloats()
   {
      for (unsigned i=0;i<floats.size();++i)
         std::cout << i << ": " << floats[i] << std::endl;   
   }

public:
   std::string mMessage;
   std::string mName;
   std::vector<int>  nums;
   std::vector<float> floats;
};

/** Class that says hello, but is not smart enough to know how */
class Greeter
{
public:
   Greeter()
   {;}
   
   void greet()
   {
      if(mMyHello.get())
         mMyHello->printWelcome();
      else
         std::cout << "<i am mute>" << std::endl;
   }
   
   void setHello(boost::shared_ptr<Hello> h)
   { mMyHello = h; }
   
   boost::shared_ptr<Hello> myHello()
   { return mMyHello; }
   
protected:
   boost::shared_ptr<Hello>   mMyHello;   /**< How I say hello */
};

class TestMeShared
{
public:
   TestMeShared()
   {;}
};

class TestMeAuto
{
public:
   TestMeAuto()
   {;}
};

#endif
